<?php

/**
 * lnshop 支付宝插件
 * Date: 2015-09-09
 */

namespace plugins\payment\alipayMobile;
/**
 * 支付 逻辑定义
 * Class AlipayPayment
 * @package Home\Payment
 */

class alipayMobile
{     
    public $alipay_config = array();// 支付宝支付配置参数

    /**
     * 析构流函数
     */
    public function __construct($config = [])
    {

        require_once("alipay.config.php");

        $this->alipay_config = array_merge($alipay_config,$config);

    }
    /**
     * 生成web支付代码
     * @param   array   $order      订单信息
     * @param   array   $config_value    支付方式信息
     */
    public function get_code($order, $config_value)
    {         
             // 接口类型
        $service = array(
            1 => 'create_partner_trade_by_buyer', //使用担保交易接口
            2 => 'create_direct_pay_by_user', //使用即时到帐交易接口
        );
            //构造要请求的参数数组，无需改动
        $parameter = array(
            "partner" => trim($this->alipay_config['partner']), //合作身份者ID，签约账号，以2088开头由16位纯数字组成的字符串，查看地址：https://b.alipay.com/order/pidAndKey.htm
            'seller_id' => trim($this->alipay_config['partner']), //收款支付宝账号，以2088开头由16位纯数字组成的字符串，一般情况下收款账号就是签约账号
            "key" => trim($this->alipay_config['key']), // MD5密钥，安全检验码，由数字和字母组成的32位字符串，查看地址：https://b.alipay.com/order/pidAndKey.htm
                        // "seller_email" => trim($this->alipay_config['seller_email']),                                            
            "notify_url" => SITE_URL . U('Payment/notifyUrl', array('pay_code' => 'alipayMobile')), //服务器异步通知页面路径 //必填，不能修改
            "return_url" => SITE_URL . U('Payment/returnUrl', array('pay_code' => 'alipayMobile')),  //页面跳转同步通知页面路径
            "sign_type" => strtoupper('MD5'), //签名方式
            "input_charset" => strtolower('utf-8'), //字符编码格式 目前支持utf-8
            "cacert" => getcwd() . '\\cacert.pem',
            "transport" => 'http', // //访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http                        
            "service" => 'alipay.wap.create.direct.pay.by.user',   // // 产品类型，无需修改                
            "payment_type" => "1", // 支付类型 ，无需修改
            "_input_charset" => trim(strtolower($this->alipay_config['input_charset'])), //字符编码格式 目前支持 gbk 或 utf-8
            "out_trade_no" => $order['order_sn'], //商户订单号
            "subject" => "ZOshop订单", //订单名称，必填
            "total_fee" => $order['order_amount'], //付款金额
            "show_url" => "http://www.xx.com", //收银台页面上，商品展示的超链接，必填

        );
            //  如果是支付宝网银支付    
        if (!empty($config_value['bank_code'])) {
            $parameter["paymethod"] = 'bankPay'; // 若要使用纯网关，取值必须是bankPay（网银支付）。如果不设置，默认为directPay（余额支付）。
            $parameter["defaultbank"] = $config_value['bank_code'];
            $parameter["service"] = 'create_direct_pay_by_user';
        }        
            //建立请求
        require_once("lib/alipay_submit.class.php");
        $alipaySubmit = new \AlipaySubmit($this->alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
        return $html_text;
    }

    /**
     * 获取移动支付参数
     */ 
    public function getMobilePay($param)
    {
        $parameter = array(
            "partner" => trim($this->alipay_config['partner']), //合作身份者ID，签约账号，以2088开头由16位纯数字组成的字符串，查看地址：https://b.alipay.com/order/pidAndKey.htm
            'seller_id'=> trim($this->alipay_config['seller_id']), //收款支付宝账号，以2088开头由16位纯数字组成的字符串，一般情况下收款账号就是签约账号
            "out_trade_no"	=> $param['order_sn'], //商户订单号
            "subject"       => $param['subject'], //订单名称，必填
            'body' => $param['body'],//商品详情
            "total_fee"	=> $param['total_amount'], //付款金额
            "notify_url"	=> $this->alipay_config['notify_url'], //服务器异步通知页面路径 //必填，不能修改
            "service" => 'mobile.securitypay.pay',   // // 产品类型，无需修改
            "payment_type"  => "1", // 支付类型 ，无需修改
            '_input_charset' => $this->alipay_config['input_charset'],
            'it_b_pay' => "30m",
            "show_url"	=> $param['show_url'], //收银台页面上，商品展示的超链接，必填
            'app_id' => $this->alipay_config['app_id'],
            'sign_type' => "RSA",
        );

        $str = '';

        foreach ($parameter as $key => $val) {
            if ($key == 'sign_type' || $key == 'sign') {
                continue;
            } else {
                if ($str == '') {
                    $str = $key.'='.'"'.$val.'"';
                } else {
                    $str = $str . '&' . $key . '=' . '"'. $val .'"';
                }
            }
        }
        require_once("lib/alipay_function.php");
        $sign = sign($str);
        $EncodeStr=urlencode($sign);//将加密后的字符串进行处理
        $str = $str.'&sign='.'"'.$EncodeStr.'"'.'&sign_type='.'"'.$parameter['sign_type'].'"';
        return $str;
    }

    /**
     * 服务器点对点响应操作给支付接口方调用
     * 
     */
    public function response()
    {
        require_once("lib/alipay_notify.class.php");  // 请求返回
        //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($this->alipay_config); // 使用支付宝原生自带的累 和方法 这里只是引用了一下 而已
        $verify_result = $alipayNotify->verifyNotify();
        
        doLog("--支付宝通知--".json_encode($_POST)."--验签结果-".$verify_result,"notifylog");

        if( !$verify_result )
        { 
            exit("fail");
        }

        if( $_POST['trade_status'] == 'WAIT_BUYER_PAY' )
        {
            exit("success");
        }

        if ($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') 
        {
           return [
                "order_sn" => trim( $_POST['out_trade_no'] ),
                "trade_no" => trim( $_POST['trade_no'] ),
                "trade_status" => $_POST['trade_status'],
                "total_fee" => $_POST['total_fee'],
           ];
        }
        
        exit("fail");
    }

    /**
     * 页面跳转响应操作给支付接口方调用
     */
    function respond2()
    {
        require_once("lib/alipay_notify.class.php");  // 请求返回
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyReturn();

        if ($verify_result) //验证成功
        {
            $order_sn = $out_trade_no = $_GET['out_trade_no']; //商户订单号
            $trade_no = $_GET['trade_no']; //支付宝交易号                   
            $trade_status = $_GET['trade_status']; //交易状态

            if ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
                return array('status' => 1, 'order_sn' => $order_sn);//跳转至成功页面
            } else {
                return array('status' => 0, 'order_sn' => $order_sn); //跳转至失败页面
            }
        } else {
            return array('status' => 0, 'order_sn' => $_GET['out_trade_no']);//跳转至失败页面
        }
    }

}